package gestion.camping.controleur;

import gestion.camping.connexion.Connexion;
import gestion.camping.dao.impl.EmplacementDao;
import gestion.camping.dao.impl.SecteurDao;
import gestion.camping.dao.impl.TypeTerrainDao;
import gestion.camping.dto.Emplacement;
import gestion.camping.dto.Secteur;
import gestion.camping.dto.TypeTerrain;
import gestion.camping.vue.ViewEmplacementDetail;
import gestion.camping.vue.ViewEmplacementListe;

import java.util.ArrayList;
import java.util.List;

import javax.swing.JDialog;

public class EmplacementController{
	
	private Emplacement emplacement;
	private Secteur secteur;
	private TypeTerrain typeTerrain;
	private Integer id;
	private List<Emplacement> listEmplacement;
	private List<Secteur> listSecteur;
	private List<TypeTerrain> listTypeTerrain;
	private EmplacementDao emplacementDao = new EmplacementDao(Connexion.getInstance());
	private SecteurDao secteurDao = new SecteurDao(Connexion.getInstance());
	private TypeTerrainDao typeTerrainDao = new TypeTerrainDao(Connexion.getInstance());
	private ViewEmplacementDetail frameDetail;
	private ViewEmplacementListe frameListe;
	private boolean isPossibleEnregistrer;
	
	/**
	 * Constructeur du controlleur personne
	 */
	public EmplacementController(){
		this.isPossibleEnregistrer = true;
		
		this.listSecteur = secteurDao.findAllSecteur();
		this.listTypeTerrain = typeTerrainDao.findAllTypeTerrain();
		
		secteur = new Secteur();
		typeTerrain = new TypeTerrain();
		
	}
	
	public EmplacementController(boolean isPossibleEnregistrer){
		this.isPossibleEnregistrer = isPossibleEnregistrer;
		
		this.listSecteur = secteurDao.findAllSecteur();
		this.listTypeTerrain = typeTerrainDao.findAllTypeTerrain();
	}


	
	/**
	 * Accesseur aux JPanel contenant la liste des personnes
	 * @return JPanel viewListe
	 */
	public ViewEmplacementListe getViewListe(){
		
		if(listEmplacement == null){
			listEmplacement = new ArrayList<Emplacement>();
		}
		
		
		//On crée la fenêtre
		frameListe = new ViewEmplacementListe(this);
	
		rechercher(null, null, null);
		
		return frameListe;
	}
	
	/**
	 * Accesseur aux JPanel contenant le détail d'une personne
	 * @return JPanel viewDetail
	 */
	public JDialog getViewDetail(){
		
		// Si emplacement est différent de null 
		if(emplacement == null){
			//on est en création
			//On crée un objet vide
			emplacement = new Emplacement();
		}
				
		//On crée la fenêtre
		frameDetail = new ViewEmplacementDetail(this);
		
		frameDetail.setVisible(true);
		
		return frameDetail;
	}

	/**
	 * Permet la gestion de l'action utilisateur Enregistrer
	 * @param personne
	 */
	public void enregistrer(Emplacement emplacement) {
		System.out.println(emplacement.toString());
		
	
		this.emplacement = emplacement;
		
		if(isPossibleEnregistrer){
			//Si l'ID est zéro
			if(emplacement.getId() == 0){ 
				//On est en création
				emplacement = emplacementDao.create(emplacement);
			}else{
				//On n'est en modification
				emplacement = emplacementDao.update(emplacement);
			}
			frameDetail.setEmplacement(emplacement);
		}			
				
	}

	/**
	 * Permet la gestion de l'action utilisateur Rechercher
	 */
	public void rechercher(Integer id, Secteur secteur, TypeTerrain typeTerrain) {
		
		//On alimente la liste des emplacements
		if(secteur == null && typeTerrain == null){
			this.listEmplacement = emplacementDao.findAllEmplacement();
			
			this.setId(null);
			this.setSecteur(null);
			this.setTypeTerrain(null);
			
		}else{
			this.listEmplacement = emplacementDao.findBySecteurTypeTerrain(id, secteur , typeTerrain);
			
			this.setSecteur(secteur);
			this.setTypeTerrain(typeTerrain);
			this.setId(id);
		}
		
		
		
		//On met à jour la fenêtre
		frameListe.setListEmplacement(listEmplacement);
	}

	/**
	 * Permet la gestion de l'action utilisateur Modifier
	 * @param personne
	 */
	public void modifier(Emplacement emplacement) {
		//On affecte la personne que l'on veut modifier	
		this.emplacement = emplacement;
		
		//On affiche la fenêtre de détail
		this.getViewDetail();
	}

	/**
	 * Permet la gestion de l'action utilisateur Retour à liste 
	 */
	public void retour() {
		if(isPossibleEnregistrer){
			//Si une recherche avait été faite
			if(listEmplacement != null && listEmplacement.size() > 0){
				//On effectue la dernière recherche
				rechercher(id, secteur , typeTerrain);
			}
		}else{
			if(listEmplacement != null){
				//On recherche si la personne et déja présente dans la lite
				int i;
				for(i=0; i<listEmplacement.size() && listEmplacement.get(i).getId() != emplacement.getId(); i++);
				if(i == listEmplacement.size()){
					listEmplacement.add(emplacement);
				}else{
					listEmplacement.remove(i); 
					listEmplacement.add(i, emplacement);
				}
				
				//On met à jour la fenêtre
				frameListe.setListEmplacement(listEmplacement);
				
			}
		}
		
	}
	

	/**
	 * Permet la gestion de l'action utilisateur Ajouter 
	 */
	public void ajouter(){
		this.emplacement = new Emplacement();
		
		
		this.getViewDetail();
	}

	public boolean isPossibleEnregistrer() {
		return isPossibleEnregistrer;
	}

	public void setPossibleEnregistrer(boolean isPossibleEnregistrer) {
		this.isPossibleEnregistrer = isPossibleEnregistrer;
	}

	public TypeTerrain getTypeTerrain() {
		return typeTerrain;
	}

	public void setTypeTerrain(TypeTerrain typeTerrain) {
		this.typeTerrain = typeTerrain;
	}

	public Secteur getSecteur() {
		return secteur;
	}

	public void setSecteur(Secteur secteur) {
		this.secteur = secteur;
	}

	public Emplacement getEmplacement() {
		return emplacement;
	}

	public void setEmplacement(Emplacement emplacement) {
		this.emplacement = emplacement;
	}

	public List<Emplacement> getListEmplacement() {
		return listEmplacement;
	}

	public void setListEmplacement(List<Emplacement> listEmplacement) {
		this.listEmplacement = listEmplacement;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public List<Secteur> getListSecteur() {
		return listSecteur;
	}

	public void setListSecteur(List<Secteur> listSecteur) {
		this.listSecteur = listSecteur;
	}

	public List<TypeTerrain> getListTypeTerrain() {
		return listTypeTerrain;
	}

	public void setListTypeTerrain(List<TypeTerrain> listTypeTerrain) {
		this.listTypeTerrain = listTypeTerrain;
	}	
}
